package com.testapp.bluetoothtest08.cipher.tool;



import com.testapp.bluetoothtest08.common.CustomException;

import java.math.BigInteger;
import java.util.Random;


public class NumberTools {


    public BigInteger generateNum(int length){
        BigInteger num = Parameter.bigTwo;
        Random random = new Random();
        num=num.pow(length-1);
        BigInteger ad = new BigInteger(length-1,random);
        return num.add(ad);
    }
    public BigInteger generateNum(int length,int rand){
        BigInteger num = Parameter.bigTwo;
        Random  random = new Random(rand);
        num=num.pow(length-1);
//        System.out.println(num.toString(2));
        BigInteger ad = new BigInteger(length-1,random);
        return num.add(ad);
    }
    public BigInteger generatePrime(int length){
        Random random = new Random();
        BigInteger num  = BigInteger.probablePrime(length,random);
        while (num.bitLength() != length){
            num = BigInteger.probablePrime(length,random);
        }
        return num;
    }
    public BigInteger generatePrime(int length,int rand){
        Random random = new Random(rand);
        BigInteger num  = BigInteger.probablePrime(length,random);
        while (num.bitLength() != length){
            num = BigInteger.probablePrime(length,random);
        }
        return num;
    }
    public BigInteger modPowList(BigInteger[] baseList,BigInteger[] exponentList,BigInteger m) {
        if (baseList.length != exponentList.length || baseList.length == 0)
            throw new CustomException(-1, "指数底数数组长度不同,或传入空列表");
        BigInteger ans = BigInteger.ONE;
        for (int i = 0; i < baseList.length; i++) {
            ans = ans.multiply(baseList[i].modPow(exponentList[i], m)).mod(m);
        }
        return ans;
    }
    public BigInteger modPowList(String[] baseList,BigInteger[] exponentList,BigInteger m){
        BigInteger[] nBaseList = new BigInteger[baseList.length];
        for(int i=0;i<baseList.length;i++){
            nBaseList[i] = new BigInteger(baseList[i]);
        }
        return modPowList(nBaseList,exponentList,m);
    }
    public BigInteger modPowList(BigInteger[] baseList,String[] exponentList,BigInteger m){
        BigInteger[] nExponentList = new BigInteger[exponentList.length];
        for(int i=0;i<exponentList.length;i++){
            nExponentList[i] = new BigInteger(exponentList[i]);
        }
        return modPowList(baseList,nExponentList,m);
    }
    public BigInteger modPowList(String[] baseList,String[] exponentList,BigInteger m){
        BigInteger[] nBaseList = new BigInteger[baseList.length];
        for(int i=0;i<baseList.length;i++){
            nBaseList[i] = new BigInteger(baseList[i]);
        }
        BigInteger[] nExponentList = new BigInteger[exponentList.length];
        for(int i=0;i<exponentList.length;i++){
            nExponentList[i] = new BigInteger(exponentList[i]);
        }
        return modPowList(nBaseList,nExponentList,m);
    }
    public BigInteger generateY(){
        //    public BigInteger Range4left ;//2^gama-2^lamtha
        //    public BigInteger Range4right ;//2^gama+2^lamtha
        Random random = new Random();
        BigInteger randy = new BigInteger(Parameter.Lamtha+1,random);
        BigInteger y = new BigInteger("1645504557321206042154969182557350504982734685041959145937305600").add(randy);
        while (!y.isProbablePrime(100)){
            randy = new BigInteger(Parameter.Lamtha+1,random);
            y = new BigInteger("1645504557321206042154969182557350504982734685041959145937305600").add(randy);
        }
        return y;
    }
//    public BigInteger modPowList(List<Object> baseList, List<Object> exponentList, BigInteger m){
//        if(baseList.size()!=exponentList.size() || baseList.size()==0)
//            throw new CustomException(-1,"指数底数列表长度不同,或传入空列表");
//        BigInteger ans = BigInteger.ONE;
//        Object b,e;
//        Iterator<Object> bItr = baseList.iterator();
//        Iterator<Object> eItr = exponentList.iterator();
//        while(bItr.hasNext()){
//            if((b = bItr.next()) instanceof String){
//                b = new BigInteger((String) b);
//            }
//            if((e = eItr.next()) instanceof String){
//                e = new BigInteger((String) e);
//            }
//            ans = ans.multiply(((BigInteger) b).modPow((BigInteger) e,m)).mod(m);
//        }
//        return ans;
//    }
//    public BigInteger modPowList(List<String> baseList,List<BigInteger> exponentList,BigInteger m){
//        List<BigInteger> nBaseList = new LinkedList<>();
//        Iterator<String> bItr = baseList.iterator();
//        while(bItr.hasNext()){
//            nBaseList.add(new BigInteger(bItr.next()));
//        }
//        return modPowList(nBaseList,exponentList,m);
//    }
//    public BigInteger modPowList(List<BigInteger> baseList,List<String> exponentList,BigInteger m){
//        List<BigInteger> nExponentList = new LinkedList<>();
//        Iterator<String> eItr = exponentList.iterator();
//        while(eItr.hasNext()){
//            nExponentList.add(new BigInteger(eItr.next()));
//        }
//        return modPowList(baseList,nExponentList,m);
//    }
//    public BigInteger modPowList(List<String> baseList,List<String> exponentList,BigInteger m){
//        List<BigInteger> nBaseList = new LinkedList<>();
//        Iterator<String> bItr = baseList.iterator();
//        while(bItr.hasNext()){
//            nBaseList.add(new BigInteger(bItr.next()));
//        }
//        List<BigInteger> nExponentList = new LinkedList<>();
//        Iterator<String> eItr = exponentList.iterator();
//        while(eItr.hasNext()){
//            nExponentList.add(new BigInteger(eItr.next()));
//        }
//        return modPowList(nBaseList,nExponentList,m);
//    }
}
